/**
 * Copyright (c), 上海沃恩信息科技有限公司.
 * All rights reserved.
 * Licensed under BSD (https://www.pittypat.work/bsd.html).
 */

package pittypat;

import java.io.IOException;
import java.io.Writer;
import java.util.ArrayList;
import java.util.List;

/**
 * 从通知服务查询到的通知列表。
 */
public final class NotificationList implements IComplex {
	/**
	 * 表示一个空的通知消息列表。这是一个只读字段。
	 */
	public static final NotificationList EMPTY = new NotificationList(0, null);

	// 一个空的通知列表。
	private static final List<INotification> EMPTY_NOTIFICATIONS = new ArrayList<INotification>();

	private long total;
	private List<INotification> notifications;

	/**
	 * 使用通知总数和通知列表初始化 NotificationList 的新实例。
	 * 
	 * @param total
	 *            通知总数。
	 * @param notifications
	 *            通知列表。
	 */
	public NotificationList(long total, List<INotification> notifications) {
		this.total = total < 0 ? 0 : total;
		this.notifications = notifications == null ? EMPTY_NOTIFICATIONS : notifications;
	}

	/**
	 * 获取通知总数。
	 * 
	 * @return 通知总数。
	 */
	public long getTotal() {
		return this.total;
	}

	/**
	 * 获取当前查询到的通知列表。
	 * 
	 * @return 当前查询到的通知列表。
	 */
	public List<INotification> getNotifications() {
		return this.notifications;
	}

	/**
	 * 将当前对象作为 JSON 字符串写入指定的文本流。
	 * 
	 * @param writer
	 *            目标文本流。 throws IllegalArgumentException writer 为 null。
	 */
	@Override
	public void write(Writer writer) throws IOException {
		if (writer == null) {
			throw new IllegalArgumentException("writer 为 null");
		}

		writer.write(String.format("{\"total\":%d,\"notifications\":[", this.total));

		if (this.notifications.size() > 0) {
			List<INotification> list = new ArrayList<INotification>();

            // 排除 null 元素
			for (INotification item : this.notifications) {
				if (item != null) {
					list.add(item);
				}
			}

			for (int i = 0; i < list.size(); ++i) {
				list.get(i).write(writer);

				if (i < list.size() - 1) {
					writer.write(',');
				}
			}
		}

		writer.write("]}");
	}
}
